 import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.List;
import java.util.ArrayList;
/**
 * Essa Classe representa o Ator Policia que é o adversário no jogo.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Policia extends PersonagemNaoJogavel implements movedor,visao
{
    private GreenfootSound apito = new GreenfootSound("apito.mp3");
    /**
     *O Act da polícia é apenas faz a chamada ao metodo mover da policia.
     */
    public void act() 
    {
        mover();
        
        atualizarX();
        atualizarY();
    }    
    
    /**
     * Esse metodo faz o policial exnergar o mundo e se mexer dependendo do que o policial viu.
     */
    public void mover(){
        World mundo = getWorld();
         if(enxergarAoRedor() == true){
            atacarLadrao(mundo);
        }else{
           movimentoAleatorio(mundo);
        }
    }
    
    /**
     * Metódo adiquirido via interface visão,faz o policial enxergar os objetos que estao ao seu redor,se detectar o ladrao ele retorna true
     * caso contrário retorna false.
     */
     public boolean enxergarAoRedor(){
         List vizinhos = procurarLadraoNaVizinhanca();
         
         if(vizinhos.isEmpty()){
           return false;//nao viu o ladrao
         }else{
           return true;//viu o ladrao
         }
     }
    
    /**
     * Outro método Adiquirido via Interface,simplesmente procura o ladrao na vizinha.
     */
    public List procurarLadraoNaVizinhanca(){
        return getNeighbours(raioDeVisao, true,Ladrao.class);
    }
    
    /**
     * Metódo invocado após o policial ver o Ladrao, simplesmente faz ele correr atrás do bandido.
     */
    public void atacarLadrao(World mundo){
        List<Ladrao> l = mundo.getObjects(Ladrao.class);
        Ladrao ladrao = l.get(0);
        int ladraoX,ladraoY;
        int diferencaX,diferencaY;
        
        ladraoX = ladrao.getX();
        ladraoY = ladrao.getY();
        
        diferencaX = calculaDiferencaDePosicao(this.getX(),ladraoX);
        diferencaY = calculaDiferencaDePosicao(this.getY(),ladraoY);
        
        setLocation(this.getX() + diferencaX, this.getY()+diferencaY);
        apito.play();
    }
    
    /**
     * Esse metodo calcula a diferença entre a posição do ladrao e do policial.
     * retorna 1 se o ladrão está à esquerda ou abaixo do policial.
     * ou retorna -1 se o ladrão está à direita ou acima do policial.
     * ou então retorna 0 se ele está no mesmo nível do policial.
     */
    private int calculaDiferencaDePosicao(int posicaoPolicial,int posicaoLadrao){
          if(posicaoLadrao - posicaoPolicial > 0){
            return 1;//o ladrao esta na esquerda ou abaixo do policial
        }else if(posicaoLadrao - posicaoPolicial < 0){
             return -1;//o ladrao esta na direita ou acima
        }else{
            return 0;//o ladrao esta no mesmo nivel do policial
        } 
    }
    
    /**
     * Método que faz o policial realizar um movimento aleatório em qualquer direção.
     */
    public void movimentoAleatorio(World mundo){
        int x,y;
        int novaPosicaoX,novaPosicaoY;
        List teste;
        
          
                x = Greenfoot.getRandomNumber(4);
                y = Greenfoot.getRandomNumber(4);
                
                // Definicao: par ele se move pra cima ou direita e impar ele se move pra baixo ou esquerda.
                if(x%2 == 0){
                    novaPosicaoX = this.getX()-1;
                }else{
                    novaPosicaoX = this.getX()+1;
                }
                
                 if(y%2 == 0){
                    novaPosicaoY = this.getY()-1;
                }else{
                    novaPosicaoY = this.getY()+1;
                }
                
                
        if(novaPosicaoX > getX()){
            setImage("policia.png");
        }else{
            setImage("policia_mini.png");
        }
        setLocation(novaPosicaoX,novaPosicaoY);
    }
    
}
